#!/bin/bash
#Estoy dentro de Subdirectorio de trabajo ../grupo12/
#Archivos que crea
# CONFDIR/Instalar_TP.conf

# +++++++++++++++++++ VARIABLES +++++++++++++++++++++++++
#Las considero relativo a $GRUPO
wkdir=`pwd`
dGRUPO="$wkdir/grupo12" #va a contener todo el path de trabajo inclusive la carpeta grupo12/
dCONFDIR="conf"
dBINDIR="bin"
dMAEDIR="mae"
dARRIDIR="arribos"
dACEPDIR="aceptados"
dRECHDIR="rechazados"
dREPODIR="listados"
dPROCDIR="procesados"
dLOGDIR="log"
dLOGEXT='.log'
dLOGSIZE='400'
dDATASIZE='100'
dsep_campos='='
dpath_padre='./'
darch_log_Instalar='Instalar_TP.log'
darch_conf_Instalar='Instalar_TP.conf'
dp1_grabar_l='INSTALAR_TP'
dp3_grabar_l_i='I'
dp3_grabar_l_w='W'
dp3_grabar_l_e='E'
dp3_grabar_l_se='SE'
destado_inst_lista='LISTA'
ddirOrigMae="$wkdir/maestros_orig/"
ddirOrigDisp="$wkdir/disp_orig/"
ddirOrigBin="$wkdir/bin_orig"
ddirOrigBckp="backup_all"
ddirOrigBckp="backup_all/"

components=('Grabar_L' 'Imprimir_B.pl' 'Iniciar_B.sh' 'Instalar_TP.sh' 'Mover_B' 'Recibir_B.sh' 'Reservar_B.sh' 'Start_D' 'Stop_D' 'verifyInstall.sh' )
missingComp=()
orig_IFS=$IFS
IFS=$'\n'

GRUPO=$dGRUPO
CONFDIR=$dCONFDIR
BINDIR=$dBINDIR
MAEDIR=$dMAEDIR
ARRIDIR=$dARRIDIR
ACEPDIR=$dACEPDIR
RECHDIR=$dRECHDIR
REPODIR=$dREPODIR
PROCDIR=$dPROCDIR
LOGDIR=$dLOGDIR
LOGEXT=$dLOGEXT
LOGSIZE=$dLOGSIZE
DATASIZE=$dDATASIZE
sep_campos=$dsep_campos
path_padre=$dpath_padre
arch_log_Instalar=$darch_log_Instalar
arch_conf_Instalar=$darch_conf_Instalar
p1_grabar_l=$dp1_grabar_l
p3_grabar_l_i=$dp3_grabar_l_i
p3_grabar_l_w=$dp3_grabar_l_w
p3_grabar_l_e=$dp3_grabar_l_e
p3_grabar_l_se=$dp3_grabar_l_se
estado_inst_lista=$destado_inst_lista
dirOrigMae=$ddirOrigMae
dirOrigDisp=$ddirOrigDisp
dirOrigBin=$ddirOrigBin
dirOrigBckp=$ddirOrigBckp
# ++++++++++++++++++ FUNCIONES ++++++++++++++++++++++++++

#ok
# Obtener respuesta entero
# $1 debe llevar el nombre de la variable de retorno 
getIntAnswer (){
	local __answer__=
	local end=false
	local enter=0
	while ! $end; do
		read __answer__
		if [[ $__answer__ = $IDF ]]; then
			end=true
		else
			enter=0
			if [ -z "${__answer__##*[!0-9]*}" ]; then
				echo "Por favor, ingrese un número entero"
			else
				end=true
			fi
		fi
	done
	eval "$1=${__answer__}"
}

#ok solo acepta si o no, o sea,"s" y "n" no son tomados como válidos por seguridad 
# Obtener respuesta Si o No
# $1 debe llevar el nombre de la variable de retorno
getYesOrNoAnswer (){
	local __answer__=
	local end=false
	while ! $end; do
		read __answer__
		__answer__=$(tr [:upper:]Íí [:lower:]ii <<< $__answer__)
		if [ \( "$__answer__" != "si" \) -a \( "$__answer__" != "no" \) ]; then
			echo "Por favor, responda si o no"
		else
			end=true
		fi
	done
	eval "$1=${__answer__}"
}

#ok
testearExistenciaCONFDIR (){
	if [ -d "$GRUPO/$CONFDIR" ]; then		
		./Grabar_L $p1_grabar_l "Se encontró directorio \"$GRUPO/$CONFDIR\"" $p3_grabar_l_i
		existeCONFDIR=true
	else
		./Grabar_L $p1_grabar_l "No se encontró \"$GRUPO/$CONFDIR\"" $p3_grabar_l_se
		existeCONFDIR=false
	fi
}

#ok - devuelve 1 si el archivo Instalar_TP.conf existe, 0 en caso contrario
existeArchConf () {
	if [ -f "$GRUPO/$CONFDIR/$arch_conf_Instalar" ]; then
		return 1
	else
		return 0
	fi
}

#ok - devuelve 1 si NO pudo crear Instalar_TP.conf (ya existe o no encontró el dir padre), 0 en caso contrario
creaArchConf () {
	`touch "$GRUPO/$CONFDIR/$arch_conf_Instalar"`
	if [ $? = 1 ]; then
		return 1
	else
		return 0
	fi
}

#ok - salvo si necesario corregir paths
# devuelve 1 si el archivo existe, 0 en caso contrario
existeSinoCreaArchConf (){
	#testearExistenciaCONFDIR
	existeArchConf
	if [ $? = 1 ]; then
		./Grabar_L $p1_grabar_l 'Archivo de configuracion ya existe' $p3_grabar_l_i
		return 1
	else
		./Grabar_L $p1_grabar_l 'No existe el archivo de configuracion' $p3_grabar_l_i
		creaArchConf
		if [ $? = 1 ]; then
			./Grabar_L $p1_grabar_l 'No se pudo crear el archivo de conf!!' $p3_grabar_l_se
		else
			`chmod uo+wr "$GRUPO/$CONFDIR/$arch_conf_Instalar"`
			if [ $? = 0 ]; then
				./Grabar_L $p1_grabar_l 'Se dieron permisos de uo+wr al archivo de configuracion.' $p3_grabar_l_i
			else
				./Grabar_L $p1_grabar_l 'No se dieron permisos de uo+wr al archivo de configuracion!' $p3_grabar_l_w
			fi
		fi
		return 0
	fi
}

#OBS: Si tiene un dir adentro te lo lista pero no entra.
listarDocsDir () {
	dirparam=$1
	if [ -n "$dirparam" -a -d "$dirparam" ]; then
		ls "$dirparam"
	fi
}

grabarEnLogEstructuraYValores () {
	./Grabar_L $p1_grabar_l 'TP SO7508 Segundo Cuatrimestre 2013. Tema B Copyright © Grupo 12' $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Librería del Sistema: $GRUPO/$CONFDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Ejecutables: $GRUPO/$BINDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Archivos maetros: $GRUPO/$MAEDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Directorio de arribo de archivos externos: $GRUPO/$ARRIDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Archivos externos aceptados: $GRUPO/$ACEPDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Archivos externos rechazados: $GRUPO/$RECHDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Reportes de salidas: $GRUPO/$REPODIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Archivos procesados: $GRUPO/$PROCDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Logs de auditoría del Sistema: $GRUPO/$LOGDIR/<comando>$LOGEXT" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Tamaño máximo para los archivos de log del sistema: $LOGSIZE Kb" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Estado de la instalación: $1" $p3_grabar_l_i
}

grabarEnLogEstructuraYValoresIncompleta () {
	./Grabar_L $p1_grabar_l 'TP SO7508 Segundo Cuatrimestre 2013. Tema B Copyright © Grupo 12' $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Librería del Sistema: $GRUPO/$CONFDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Ejecutables: $GRUPO/$BINDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Archivos maetros: $GRUPO/$MAEDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Directorio de arribo de archivos externos: $GRUPO/$ARRIDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Archivos externos aceptados: $GRUPO/$ACEPDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Archivos externos rechazados: $GRUPO/$RECHDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Reportes de salidas: $GRUPO/$REPODIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Archivos procesados: $GRUPO/$PROCDIR" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Logs de auditoría del Sistema: $GRUPO/$LOGDIR/<comando>$LOGEXT" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Tamaño máximo para los archivos de log del sistema: $LOGSIZE Kb" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Componentes faltantantes:" $p3_grabar_l_i
	./Grabar_L $p1_grabar_l "Estado de la instalación: $1" $p3_grabar_l_i
}

# Retorna 1 si faltan componentes en los dirs del user!
obtenerComponentesFaltantes (){
	echo "Dentro de componentes faltantes verifica si falta archivos en los dirs del user"
	if [ ! -f "$GRUPO/$MAEDIR/obras.mae" ]; then
		missingComp+=('obras.mae')
	fi
	if [ ! -f "$GRUPO/$MAEDIR/salas.mae" ]; then
		missingComp+=('salas.mae')
	fi
	if [ ! -f "$GRUPO/$PROCDIR/combos.dis"  ]; then
		missingComp+=('combos.dis')
	fi
	for var in ${components[@]}
	do
		if [ ! -f "$GRUPO/$BINDIR/${var}" -a ${var} != "Instalar_TP.sh" ]; then
			missingComp+=("${var}")
		fi
	done
	if [ ${#missingComp[@]} -gt 0 ]; then
		return 1
	else
		return 0
	fi
}

#OK
verificarExistenciaBackup (){
	for var in ${missingComp[@]}
	do
		if [ ! -f "$wkdir/$dirOrigBckp/${var}" ]; then
			return 1
		fi
	done
	return 0
	
}

#OK
listarComponentesFaltantes () {
	for var in ${missingComp[@]}
	do
		echo "  $var"
		./Grabar_L $p1_grabar_l "Componente faltante ${var}" $p3_grabar_l
	done
}

#TODO probar que muestre bien las variables que levanta del conf
showEstructuraYValores () {
	clear
	echo -e "TP SO7508 Segundo Cuatrimestre 2013. Tema B Copyright © Grupo 12 \n"
	echo "Librería del Sistema: $GRUPO/$CONFDIR"
	listarDocsDir "$GRUPO/$CONFDIR"
	echo "Ejecutables: $GRUPO/$BINDIR"
	listarDocsDir "$GRUPO/$BINDIR"
	echo "Archivos maetros: $GRUPO/$MAEDIR"
	listarDocsDir "$GRUPO/$MAEDIR"
	echo "Directorio de arribo de archivos externos: $GRUPO/$ARRIDIR"
	echo "Archivos externos aceptados: $GRUPO/$ACEPDIR"
	echo "Archivos externos rechazados: $GRUPO/$RECHDIR"
	echo "Reportes de salidas: $GRUPO/$REPODIR"
	echo "Archivos procesados: $GRUPO/$PROCDIR"
	echo "Logs de auditoría del Sistema: $GRUPO/$LOGDIR/<comando>$LOGEXT"
	echo "Componentes faltantes:"
	listarComponentesFaltantes
	echo "Estado de la instalación: INCOMPLETA"
	grabarEnLogEstructuraYValoresIncompleta 'INCOMPLETA'

}

showEstructuraYValoresParam () {
	clear
	echo -e "TP SO7508 Segundo Cuatrimestre 2013. Tema B Copyright © Grupo 12 \n"
	echo "Librería del Sistema: $GRUPO/$CONFDIR"
	listarDocsDir "$GRUPO/$CONFDIR"
	echo "Ejecutables: $GRUPO/$BINDIR"
	listarDocsDir "$GRUPO/$BINDIR"
	echo "Archivos maetros: $GRUPO/$MAEDIR"
	listarDocsDir "$GRUPO/$MAEDIR"
	echo "Directorio de arribo de archivos externos: $GRUPO/$ARRIDIR"
	echo "Archivos externos aceptados: $GRUPO/$ACEPDIR"
	echo "Archivos externos rechazados: $GRUPO/$RECHDIR"
	echo "Reportes de salidas: $GRUPO/$REPODIR"
	echo "Archivos procesados: $GRUPO/$PROCDIR"
	echo "Logs de auditoría del Sistema: $GRUPO/$LOGDIR/<comando>$LOGEXT"
	echo "Estado de la instalación: $1"
	grabarEnLogEstructuraYValores $1
}

showEstructuraYValoresLISTA () {
	echo -e "TP SO7508 Segundo Cuatrimestre 2013. Tema B Copyright © Grupo 12 \n"
	echo "Librería del Sistema: $GRUPO/$CONFDIR"
	listarDocsDir "$GRUPO/$CONFDIR"
	echo "Ejecutables: $GRUPO/$BINDIR"
	listarDocsDir "$GRUPO/$BINDIR"
	echo "Archivos maetros: $GRUPO/$MAEDIR"
	listarDocsDir "$GRUPO/$MAEDIR"
	echo "Directorio de arribo de archivos externos: $GRUPO/$ARRIDIR"
	echo "Archivos externos aceptados: $GRUPO/$ACEPDIR"
	echo "Archivos externos rechazados: $GRUPO/$RECHDIR"
	echo "Reportes de salidas: $GRUPO/$REPODIR"
	echo "Archivos procesados: $GRUPO/$PROCDIR"
	echo "Logs de auditoría del Sistema: $GRUPO/$LOGDIR/<comando>$LOGEXT"
	echo "Tamaño máximo para los archivos de log del sistema: $LOGSIZE Kb"
	echo "Estado de la instalación: LISTA"
	grabarEnLogEstructuraYValores $estado_inst_lista 
}

#ok
showStdoutTermYCond (){
	echo
	echo -e 'TP SO7508 Segundo Cuatrimestre 2013. Tema B Copyright © Grupo 12 \n'
	echo 'ATENCION: Al instalar TP SO7508 Segundo Cuatrmiestre 2013 UD. '
	echo -e 'expresa aceptar los términos y Condiciones del "ACUERDO DE LICENCIA DE SOFTWARE" incluido en este paquete.\n'
	echo 'Acepta? Si - No'
}

#ok
msjErrorPerlNoInstalado (){
	echo "TP SO7508 Segundo Cuatrimestre 2013. Tema B Copyright © Grupo 12"
	echo -n "Para instalar el TP es necesario contar con Perl 5 o superior \n"
	echo -e "instalado. Efectúe su instalación e inténtelo nuevamente.\n"
	echo "Proceso de Instalación Cancelado"
}

#OK
msjYLogVersionPerlInstalada (){
	local version=$1
	echo "TP SO7508 Segundo Cuatrimestre 2013. Tema B Copyright © Grupo 12"
	./Grabar_L $p1_grabar_l "TP SO7508 Segudno Cuatrimestre 2013. Tema B Copyright © Grupo 12" $p3_grabar_l_i
	echo "Version Perl: $version"
	./Grabar_L $p1_grabar_l "Version Perl: $version" $p3_grabar_l_i
}

#OK
#retorna 0 si no esta instalada v5 o mayor; 1 en caso contrario
verificaPerl(){
	local instalado=1
	local version=0
	local versionRequerida=5
	local siStatusOkInstaldo=$(perl -v)
	if [ $? -ne 0 ]; then
		instalado=0
	else
		version=$(perl -v | grep 'v[0-9]\+' | sed -r 's/.*v([0-9.]+).*/\1/')
		versionInstalada=${version%%.*}
		if [ $versionInstalada -lt $versionRequerida ]; then
			instalado=0
		fi
	fi
	if [ $instalado -eq 0 ]; then
		msjErrorPerlNoInstalado
		./Grabar_L $p1_grabar_l "TP SO7508 Segundo Cuatrimestre 2013. Tema B Copyright © Grupo 12 Para instalar el TP es necesario contar con Perl 5 o superior instalado. Efectúe su instalacion e inténtelo nuevamente." $p3_grabar_l_e
		return 0
	else
		msjYLogVersionPerlInstalada $version
		return 1
	fi
}

#OK
pideYValidaDataSizeConEspDisco() {
	local espacioOK=false
	dir=$GRUPO
	while ! $espacioOK
	do
		echo "Defina el espacio mínimo libre para el arribo de archivos externos en MB ($DATASIZE):"
		getIntAnswer datasize
		if [[ $datasize != $IDF ]]; then
			DATASIZE=$datasize
		fi
		local partitionSize=$(df -m ${HOME} | tail -1 | awk {'print $2'})
		if [ $DATASIZE -lt $partitionSize ]; then
			espacioOK=true
		else
			./Grabar_L $p1_grabar_l "Insuficiente espacio en disco." $p3_grabar_l_w
			echo  "Insuficiente espacio en disco."
			./Grabar_L $p1_grabar_l "Espacio disponible: $partitionSize Mb." $p3_grabar_l_w
			echo  "Espacio disponible: $partitionSize Mb."
			./Grabar_L $p1_grabar_l "Espacio requerido: $DATASIZE Mb" $p3_grabar_l_w
			echo "Espacio requerido: $DATASIZE Mb"
			./Grabar_L $p1_grabar_l "Cancele la instalación o inténtelo más tarde o vuelva a intentarlo con otro valor." $p3_grabar_l_w
			echo  "Cancele la instalación o inténtelo más tarde o vuelva a intentarlo con otro valor."
		fi
	done
}

#OK - (talvez podría tener ruido aca si el IDF no es el enter TODO definir el IDF como el enter!!!)
defineLOGDIR (){
	local  dirDeLogs
	echo "Defina el directorio de logs ($LOGDIR):"
	read dirDeLogs
	if [[ $dirDeLogs != $IDF ]]; then
		LOGDIR=$dirDeLogs
	fi
	./Grabar_L $p1_grabar_l "Defina el directorio de logs ($LOGDIR):" $p3_grabar_l_i
}

#TODO podría ahcer que si ingresa un enter que tome el valor por defecto para no tener que escribir tanto tantas veces!!
pideYObtieneDirs () {
	./Grabar_L $p1_grabar_l "Defina el directorio de instalación de los ejecutables ($GRUPO/$BINDIR):" $p3_grabar_l_i
	echo "Defina el directorio de instalación de los ejecutables ($GRUPO/$BINDIR):"
	read bin
	if [[ $bin != $IDF ]]; then
		BINDIR=$bin
	fi
	./Grabar_L $p1_grabar_l "Defina el directorio de instalación de los archivos maestros ($GRUPO/$MAEDIR):" $p3_grabar_l_i
	echo "Defina el directorio de instalación de los archivos maestros ($GRUPO/$MAEDIR):"
	read mae
	if [[ $mae != $IDF ]]; then
		MAEDIR=$mae
	fi
	./Grabar_L $p1_grabar_l "Defina el directorio de arribo de archivos externos ($GRUPO/$ARRIDIR):" $p3_grabar_l_i
	echo "Defina el directorio de arribo de archivos externos ($GRUPO/$ARRIDIR):"
	read arri
	if [[ $arri != $IDF ]]; then
		ARRIDIR=$arri
	fi
	pideYValidaDataSizeConEspDisco
	./Grabar_L $p1_grabar_l "Defina el directorio de grabación de los archivos externos aceptados ($GRUPO/$ACEPDIR):" $p3_grabar_l_i
	echo "Defina el directorio de grabación de los archivos externos aceptados ($GRUPO/$ACEPDIR):"
	read acep
	if [[ $acep != $IDF ]]; then
		ACEPDIR=$acep
	fi
	./Grabar_L $p1_grabar_l "Defina el directorio de grabación de los archivos externos rechazados ($GRUPO/$RECHDIR):" $p3_grabar_l_i
	echo "Defina el directorio de grabación de los archivos externos rechazados ($GRUPO/$RECHDIR):"
	read rech
	if [[ $rech != $IDF ]]; then
		RECHDIR=$rech
	fi
	./Grabar_L $p1_grabar_l "Defina el directorio de grabación de los listados de salida ($GRUPO/$REPODIR):" $p3_grabar_l_i
	echo "Defina el directorio de grabación de los listados de salida ($GRUPO/$REPODIR):"
	read repo
	if [[ $repo != $IDF ]]; then
		REPODIR=$repo
	fi
	./Grabar_L $p1_grabar_l "Defina el directorio de grabación de los archivos procesados ($GRUPO/$PROCDIR):" $p3_grabar_l_i
	echo "Defina el directorio de grabación de los archivos procesados ($GRUPO/$PROCDIR):"
	read proc
	if [[ $proc != $IDF ]]; then
		PROCDIR=$proc
	fi
	defineLOGDIR
	./Grabar_L $p1_grabar_l "Ingrese la extensión para los archivos de log: ($LOGEXT):" $p3_grabar_l_i
	echo "Ingrese la extensión para los archivos de log: ($LOGEXT):"
	read logext
	if [[ $logext != $IDF ]]; then
		LOGEXT=$logext
	fi
	./Grabar_L $p1_grabar_l "Defina el tamaño máximo para los archivos $LOGEXT en KBytes ($LOGSIZE):" $p3_grabar_l_i
	echo "Defina el tamaño máximo para los archivos $LOGEXT en KBytes ($LOGSIZE):"
	getIntAnswer logsize
	if [[ $logsize != $IDF ]]; then
		LOGSIZE=$logsize
	fi
}
 
#OK
confirmaInstalacion () {
	./Grabar_L $p1_grabar_l 'Iniciando instalación. Esta Ud. seguro? (Si-No)' $p3_grabar_l_i
	echo 'Iniciando instalación. Esta Ud. seguro? (Si-No)'
	getYesOrNoAnswer iniciarInstalacion
	if [ "$iniciarInstalacion" = "si" ]; then
		return 1
	else
		return 0
	fi
}

#OK
limpiaPathConf (){
	temp=${CONFDIR%/*} #le saco la ultima barra
	CONFDIR=${temp##*/} #saca hasta la ultima barra
}

#OK sin  y con espacios
limpiaPathVars (){
	temp=$1
	#1) si tiene la palabra grupo12 le saco hasta ahi
	#2) si el ultimo char es una barra, la saco
	#3) si el 1er char es un barra le saco
	#4) listo!

	#1)OK
	if echo "$temp" | grep -q "$substring" ; then
		res=$(sed 's/.*grupo12//' <<< $temp)
	fi
	#2)OK
	temp2="${res##*/}" #si tuviera la ulitma barra quedaria null y entraria al if de abajo
	if [[ -z "$temp2" ]]; then
		#le saco desde la ultima barra
		sin_ult_barra=${res%/*} #sin_ult_barra me sirve para seguir
	else
		sin_ult_barra=$res
	fi
	#3)OK
	temp3=${sin_ult_barra%%/*}
	if [[ -z "$temp3" ]]; then
		#el 1er char es una barra. Se la saco
		sin_barra_ini_y_fin=${sin_ult_barra#*/}
	else
		sin_barra_ini_y_fin=$sin_ult_barra
	fi
	#eval "$1=${__answer__}"
	#eval "$1=${sin_barra_ini_y_fin}"
	#$1="'$sin_barra_ini_y_fin'"
	#$1=$sin_barra_ini_y_fin
	#echo "$sin_barra_ini_y_fin"
}

#OK con y sin espacios
actuArchConf (){
	local userName=`whoami`
	if [[ -f "$GRUPO/$CONFDIR/$arch_conf_Instalar" ]]; then
		echo 'Actualizando la configuración del sistema'
		echo "GRUPO$sep_campos"$GRUPO"$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		limpiaPathConf
		echo "CONFDIR$sep_campos$CONFDIR$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		limpiaPathVars $BINDIR
		BINDIR=$sin_barra_ini_y_fin
		#echo "BINDIR=$sin_barra_ini_y_fin antes de escribir en el log!"
		echo "BINDIR$sep_campos"$BINDIR"$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		limpiaPathVars $MAEDIR
		MAEDIR=$sin_barra_ini_y_fin
		#echo "MAEDIR=$sin_barra_ini_y_fin antes de escribir en el log!"
		echo "MAEDIR$sep_campos"$MAEDIR"$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		limpiaPathVars $ARRIDIR
		ARRIDIR=$sin_barra_ini_y_fin
		#echo "ARRIDIR=$sin_barra_ini_y_fin antes de escribir en el log!"
		echo "ARRIDIR$sep_campos"$ARRIDIR"$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		limpiaPathVars $ACEPDIR
		ACEPDIR=$sin_barra_ini_y_fin
		#echo "ACEPDIR=$sin_barra_ini_y_fin antes de escribir en el log!"
		echo "ACEPDIR$sep_campos"$ACEPDIR"$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		limpiaPathVars $RECHDIR
		RECHDIR=$sin_barra_ini_y_fin
		#echo "RECHDIR=$sin_barra_ini_y_fin antes de escribir en el log!"
		echo "RECHDIR$sep_campos"$RECHDIR"$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		limpiaPathVars $REPODIR
		REPODIR=$sin_barra_ini_y_fin
		#echo "REPODIR=$sin_barra_ini_y_fin antes de escribir en el log!"
		echo "REPODIR$sep_campos"$REPODIR"$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		limpiaPathVars $PROCDIR
		PROCDIR=$sin_barra_ini_y_fin
		#echo "PROCDIR=$sin_barra_ini_y_fin antes de escribir en el log!"
		echo "PROCDIR$sep_campos"$PROCDIR"$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		limpiaPathVars $LOGDIR
		LOGDIR=$sin_barra_ini_y_fin
		#echo "LOGDIR=$sin_barra_ini_y_fin antes de escribir en el log!"
		echo "LOGDIR$sep_campos"$LOGDIR"$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		limpiaPathVars $LOGEXT
		echo "LOGEXT$sep_campos$LOGEXT$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		echo "LOGSIZE$sep_campos$LOGSIZE$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		echo "DATASIZE$sep_campos$DATASIZE$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
		#echo "IFS$sep_campos$IFS$sep_campos$userName$sep_campos`date`" >> "$GRUPO/$CONFDIR/$arch_conf_Instalar"
	else
		./Grabar_L $p1_grabar_l "No se encontro el \"$arch_conf_Instalar\" en el directorio \"$CONFDIR\"!" $p3_grabar_l_e
	fi
}

#OK
#TODO en el momento de ejecutarlo en las PCs del lab ver si crea las carpetas con persmisos de "wrx"
crearEstructuraDirs (){
	echo 'Creando Estructura de directorio. . .'
	if [ -d "$GRUPO/$BINDIR" ]; then
		./Grabar_L $p1_grabar_l "El directorio \"$GRUPO/$BINDIR\" ya existe!!" $p3_grabar_l_e
	else
		`mkdir -p "$GRUPO/$BINDIR"`
	fi
	if [ -d "$GRUPO/$MAEDIR" ]; then
		./Grabar_L $p1_grabar_l "El directorio \"$GRUPO/$MAEDIR\" ya existe!!" $p3_grabar_l_e
	else
		`mkdir -p "$GRUPO/$MAEDIR"`
	fi
	if [ -d "$GRUPO/$ARRIDIR" ]; then
		./Grabar_L $p1_grabar_l "El directorio \"$GRUPO/$ARRIDIR\" ya existe!!" $p3_grabar_l_e
	else	
		`mkdir -p "$GRUPO/$ARRIDIR"`
	fi
	if [ -d "$GRUPO/$REPODIR" ]; then
		./Grabar_L $p1_grabar_l "El directorio \"$GRUPO/$REPODIR\" ya existe!!" $p3_grabar_l_e
	else	
		`mkdir -p "$GRUPO/$REPODIR"`
	fi
	if [ -d "$GRUPO/$RECHDIR" ]; then
		./Grabar_L $p1_grabar_l "El directorio \"$GRUPO/$RECHDIR\" ya existe!!" $p3_grabar_l_e
	else
		`mkdir -p "$GRUPO/$RECHDIR"`
	fi
	if [ -d "$GRUPO/$ACEPDIR" ]; then
		./Grabar_L $p1_grabar_l "El directorio \"$GRUPO/$ACEPDIR\" ya existe!!" $p3_grabar_l_e
	else
		`mkdir -p "$GRUPO/$ACEPDIR"`
	fi
	if [ -d "$GRUPO/$PROCDIR" ]; then
		./Grabar_L $p1_grabar_l "El directorio \"$GRUPO/$PROCDIR\" ya existe!!" $p3_grabar_l_e
	else
		`mkdir -p "$GRUPO/$PROCDIR"`
	fi
	if [ -d "$GRUPO/$LOGDIR" ]; then
		./Grabar_L $p1_grabar_l "El directorio \"$GRUPO/$LOGDIR\" ya existe!!" $p3_grabar_l_e
	else	
		`mkdir -p "$GRUPO/$LOGDIR"`
	fi
	echo 'Instalando Archivos Maestros'
	#Mover_B <origen> <destino> <comando>
	./Mover_B "$wkdir/maestros_orig/obras.mae" "$GRUPO/$MAEDIR/" $p1_grabar_l
	./Mover_B "$wkdir/maestros_orig/salas.mae" "$GRUPO/$MAEDIR/" $p1_grabar_l
	echo 'Instalando Archivos de Disponibilidad'
	./Mover_B "$wkdir/disp_orig/combos.dis" "$GRUPO/$PROCDIR/" $p1_grabar_l
	echo 'Instalando Programas y Funciones'
	./Mover_B "$wkdir/bin_orig/Imprimir_B.pl" "$GRUPO/$BINDIR/" $p1_grabar_l
	./Mover_B "$wkdir/bin_orig/Iniciar_B.sh" "$GRUPO/$BINDIR/" $p1_grabar_l
	./Mover_B "$wkdir/bin_orig/Recibir_B.sh" "$GRUPO/$BINDIR/" $p1_grabar_l
	./Mover_B "$wkdir/bin_orig/Reservar_B.sh" "$GRUPO/$BINDIR/" $p1_grabar_l
	./Mover_B "$wkdir/bin_orig/Start_D" "$GRUPO/$BINDIR/" $p1_grabar_l
	./Mover_B "$wkdir/bin_orig/Stop_D" "$GRUPO/$BINDIR/" $p1_grabar_l
	./Mover_B "$wkdir/bin_orig/verifyInstall.sh" "$GRUPO/$BINDIR/" $p1_grabar_l
	`cp "$wkdir/Grabar_L" "$GRUPO/$BINDIR/"`
	if [ $? = 1 ]; then
		./Grabar_L $p1_grabar_l "No se pudo copiar \"Grabar_L\" desde \"$wkdir\" hacia \"$GRUPO/$BINDIR\" !" $p3_grabar_l_e
	fi
	`cp "$wkdir/Mover_B" "$GRUPO/$BINDIR/"`
	if [ $? = 1 ]; then
		./Grabar_L $p1_grabar_l "No se pudo copiar \"Mover_B\" desde \"$wkdir\" hacia \"$GRUPO/$BINDIR\" !" $p3_grabar_l_e
	fi
	actuArchConf 
}

#TODO terminar
reconfigurarRemaining (){
	searchInArray 'GRUPO'
	if [ $? = 1 ]; then
		GRUPO=$dGRUPO
	fi
	searchInArray 'CONFDIR'
	if [ $? = 1 ]; then
		CONFDIR=$dCONFDIR
	fi
	searchInArray 'BINDIR'
	if [ $? = 1 ]; then
		BINDIR=$dBINDIR
	fi
	searchInArray 'MAEDIR'
	if [ $? = 1 ]; then
		MAEDIR=$dMAEDIR
	fi
	searchInArray 'ARRIDIR'
	if [ $? = 1 ]; then
		ARRIDIR=$dARRIDIR
	fi
	searchInArray 'ACEPDIR'
	if [ $? = 1 ]; then
		ACEPDIR=$dACEPDIR
	fi
	searchInArray 'RECHDIR'
	if [ $? = 1 ]; then
		RECHDIR=$dRECHDIR
	fi
	searchInArray 'REPODIR'
	if [ $? = 1 ]; then
		REPODIR=$dREPODIR
	fi
	searchInArray 'PROCDIR'
	if [ $? = 1 ]; then
		PROCDIR=$dPROCIDR
	fi
	searchInArray 'LOGDIR'
	if [ $? = 1 ]; then
		LOGDIR=$dLOGDIR
	fi
	searchInArray 'LOGEXT'
	if [ $? = 1 ]; then
		LOGEXT=$dLOGEXT
	fi
	searchInArray 'LOGSIZE'
	if [ $? = 1 ]; then
		LOGSIZE=$dLOGSIZE
	fi
	searchInArray 'DATASIZE'
	if [ $? = 1 ]; then
		DATASIZE=$dDATASIZE
	fi
}

searchInArray () {
	for i in ${badVars[@]}
	do
    		if [ "$i" == "$1" ] ; then
        		return 1
    		fi
	done
	return 0
}

#OK
levantarElConf (){
	local confVars=( "GRUPO" "CONFDIR" "BINDIR" "MAEDIR" "ARRIDIR" "ACEPDIR" "RECHDIR" "REPODIR" "PROCDIR" "LOGDIR" "LOGEXT" "LOGSIZE" "DATASIZE" )
	for var in ${confVars[@]}
	do
		campo=`grep "^${var}" "$GRUPO/$CONFDIR/$arch_conf_Instalar" | cut -d= -f 2`
		if [[ "$var" == "GRUPO" ]]; then
			GRUPO=$campo
		elif [[ "$var" == "CONFDIR" ]]; then
			CONFDIR=$campo
		elif [[ "$var" == "BINDIR" ]]; then
			BINDIR=$campo
		elif [[ "$var" == "MAEDIR" ]]; then
			MAEDIR=$campo
		elif [[ "$var" == "ARRIDIR" ]]; then
			ARRIDIR=$campo
		elif [[ "$var" == "ACEPDIR" ]]; then
			ACEPDIR=$campo
		elif [[ "$var" == "RECHDIR" ]]; then
			RECHDIR=$campo
		elif [[ "$var" == "REPODIR" ]]; then
			REPODIR=$campo
		elif [[ "$var" == "PROCDIR" ]]; then
			PROCDIR=$campo
		elif [[ "$var" == "LOGDIR" ]]; then
			LOGDIR=$campo
		elif [[ "$var" == "LOGEXT" ]]; then
			LOGEXT=$campo
		elif [[ "$var" == "LOGSIZE" ]]; then
			LOGSIZE=$campo
		elif [[ "$var" == "DATASIZE" ]]; then
			DATASIZE=$campo
		fi
	done
}

reponerComponentesFaltantes (){
	for var in ${missingComp[@]}; do
		if [ ${var} == "obras.mae" -o ${var} == "salas.mae" ]; then
			diraux="${GRUPO}/${MAEDIR}"
			`cp "$dirOrigBckp/${var}" "${diraux}/"`
		elif [ ${var} == "combos.dis" ]; then
			diraux="${GRUPO}/${PROCDIR}"
			`cp "$dirOrigBckp/${var}" "${diraux}/"`
				
		else
			diraux="${GRUPO}/${BINDIR}"
			`cp "$dirOrigBckp/${var}" "${diraux}/"`
		fi
	done
}

setearPermisosFunciones (){
	#Doy permisos a los dos que estan conmigo.
	#OK
	chmod u+rwx "Grabar_L"
	if [ $? = 1 ]; then
		./Grabar_L $p1_grabar_l "No se dieron permisos de u+wrx a \"Grabar_L\"!" $p3_grabar_l_e
	else
		./Grabar_L $p1_grabar_l "Se dieron permisos de u+wrx a \"Grabar_L\"!" $p3_grabar_l_i
	fi
	#OK
	chmod u+rwx "Mover_B"
	if [ $? = 1 ]; then
		./Grabar_L $p1_grabar_l "No se dieron permisos de u+wrx a \"Mover_B\"!" $p3_grabar_l_e
	else 
		./Grabar_L $p1_grabar_l "Se dieron permisos de u+wrx a \"Mover_B\"!" $p3_grabar_l_i
	fi
	#Doy permiso a los que estan en backup
	for file in `ls "${dirOrigBckp}"`; do
		if [ "$file" != "obras.mae" -a "$file" != "salas.mae" -a "$file" != "combos.dis" ]; then
			chmod u+rwx "${dirOrigBckp}/${file}"	
			if [ $? = 1 ]; then
				./Grabar_L $p1_grabar_l "No se dieron permisos de u+wrx al \"$file\" presente en \"${dirOrigBckp}\"!" $p3_grabar_l_e
			else
				./Grabar_L $p1_grabar_l "Se dieron permisos de u+wrx al \"$file\" presente en \"${dirOrigBckp}\"!" $p3_grabar_l_i
			fi
		fi
	done
	#Doy permiso a los que estan en orig bin
	for file in `ls "${dirOrigBin}"`; do
		chmod u+rwx "${dirOrigBin}/$file"
		if [ $? = 1 ]; then
			./Grabar_L $p1_grabar_l "No se dieron permisos de u+wrx al \"$file\" presente en \"${dirOrigBin}\"!" $p3_grabar_l_e
		else
			./Grabar_L $p1_grabar_l "Se dieron permisos de u+wrx a \"$file\" presente en \"${dirOrigBin}\"!" $p3_grabar_l_i
		fi
	done
}

# +++++++++++++++++++++++++++++++++++++++++++
main () {
	setearPermisosFunciones
	local instalar= #boolean
	local instalacionCompleta= #int
	local concluirInstalacion=false
	echo 'Inicio de Ejecución'
	./Grabar_L $p1_grabar_l 'Inicio de Ejecución' $p3_grabar_l_i
	#1 Inicializar archivo de log
	#Para buscar que no se haya instalado el tp anteriormente... MEJORA: Puedo definir una función que haga esto pasando algunos parametros
	#2. Mostrar (y grabar en el log) donde se graba el log de la instalación
	echo "Log del comando Instalar_TP: $GRUPO/$CONFDIR/$arch_log_Instalar"
	./Grabar_L $p1_grabar_l "Log del comando Instalar_TP: $GRUPO/$CONFDIR/$arch_log_Instalar" $p3_grabar_l_i
	#3. Mostrar (y grabar en el log) el nombre del directorio de configuración
	echo "Directorio de Configuracion: $GRUPO/$CONFDIR"
	./Grabar_L $p1_grabar_l "Directorio de Configuracion: $GRUPO/$CONFDIR" $p3_grabar_l_i
	#4. Detectar si el paquete RESER_B o alguno de sus compontentes ya está instalado
	#existeSinoCreaArchConf
	if [ ! -f "$GRUPO/$CONFDIR/$arch_conf_Instalar" ]; then #archivo conf no existia pero lo cree
		showStdoutTermYCond
		getYesOrNoAnswer aceptaTerminos
		if [ $aceptaTerminos = "si" ]; then
			instalar=true
		else
			instalar=false
		fi
		if $instalar ; then #entra si instalar=true
			verificaPerl
			if [ $? = 1 ]; then
				while ! $concluirInstalacion
				do
					pideYObtieneDirs
					clear
					showEstructuraYValoresLISTA
					confirmaInstalacion
					if [ $? = 1 ]; then
						existeSinoCreaArchConf 
						crearEstructuraDirs
						concluirInstalacion=true
						./Grabar_L $p1_grabar_l 'Instalación CONCLUÍDA' $p3_grabar_l_i
						echo 'Instalación CONCLUÍDA'
					else
						./Grabar_L $p1_grabar_l 'El usuario no quizo iniciar la instalación.'  $p3_grabar_l_i	
					fi	
				done
			fi
		./Mover_B "$wkdir/$p1_grabar_l.log" "$GRUPO/$CONFDIR/" "$p1_grabar_l"
		./Mover_B "$wkdir/Mover_B.log" "$GRUPO/$LOGDIR/" "$p1_grabar_l" #internamente hace un log y vuelve a generar otro Mover_B.log
		`rm "Mover_B.log"`
		fi
	else #encontró el .conf
		levantarElConf
		#1) verificar si esta completa
		obtenerComponentesFaltantes 
		instalacionCompleta=$?
		if [ $instalacionCompleta -eq 0 ]; then
			showEstructuraYValoresParam 'COMPLETA'
			./Grabar_L $p1_grabar_l 'Proceso de Instalación Cancelado' $p3_grabar_l_i
			echo 'Proceso de Instalación Cancelado'
			instalar=false
		else
			showEstructuraYValores 'INCOMPLETA'
			./Grabar_L $p1_grabar_l 'Desea completar la instalación? (Si-No)' $p3_grabar_l_i
			echo 'Desea completar la instalación? (Si-No)'
			getYesOrNoAnswer respuesta
			if [ $respuesta = 'si' ]; then
				verificarExistenciaBackup
				if [ $? = 1 ]; then
					echo "Faltan archivos en la carpeta \"$dirOrigBckp\" !"
					./Grabar_L $p1_grabar_l "Faltan archivos en la carpeta \"$dirOrigBckp\" !" $p3_grabar_l_se
				else
					# el usuario no puede cambiar las opciones que faltan
					verificaPerl
					if [ $? = 1 ]; then
						#de la variables que estan vacias chantearle los valores por default!
						#reconfigurarRemaining ver si hay que borrar
						showEstructuraYValoresLISTA
						confirmaInstalacion
						if [ $? = 1 ]; then
							reponerComponentesFaltantes
							concluirInstalacion=true
							./Grabar_L $p1_grabar_l 'Instalación CONCLUÍDA' $p3_grabar_l_i
							echo 'Instalación CONCLUÍDA'
						else
							./Grabar_L $p1_grabar_l 'El usuario no quizo iniciar la instalación.'  $p3_grabar_l_i	
						fi
					fi
				fi
			fi
		fi
		./Mover_B "$wkdir/$p1_grabar_l.log" "$GRUPO/$CONFDIR/" "$p1_grabar_l"
		./Mover_B "$wkdir/Mover_B.log" "$GRUPO/$LOGDIR/" "$p1_grabar_l" #internamente hace un log y vuelve a generar otro Mover_B.log
		`rm "Mover_B.log"`
	fi
}
main
IFS=$orig_IFS #o hacer unset IFS .Es solo para que en nuestras PCs le devuelva al valor por defecto.
